#ifndef _M_LOG_INTERFACE_H_
#define _M_LOG_INTERFACE_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_object.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 日志格式定义
 */
typedef struct TMLogDataTag TMLogData;
struct TMLogDataTag
{    
    UInt32 id;      ///< 最高三位3bit:级别 中间8bit:模块号 剩余21bit:日志ID
    UInt32 time;    ///< 时间戳,tick
    UInt32 data1;    ///< 数据1  
    UInt32 data2;    ///< 数据2               
};

/**
 * 日志级别
 */
enum TMLogLevelEnumTag 
{
    kMLogLevelSilent = 0,  ///< 静默级别
    kMLogLevelAssert = 1,  ///< 断言级别
    kMLogLevelError = 2,   ///< 错误级别
    kMLogLevelWarning = 3, ///< 警告级别
    kMLogLevelInfo = 4,    ///< 信息级别
    kMLogLevelDebug = 5,   ///< 调试级别
    kMLogLevelTrace = 6,   ///< 追踪级别
};
typedef enum TMLogLevelEnumTag TMLogLevelEnum;

typedef struct IMLogBackendTag IMLogBackend;

/**
 * 后端日志输出接口
 * @param sender: 对象指针
 * @param data: 日志数据
 * @param count: 日志项数
 * @return 实际输出的大小
 */
typedef Int32(*IMLogBackendDoOutput)(IMLogBackend *sender, const TMLogData *data, UInt8 count);

/**
 * 立即刷新缓存接口
 * @param sender: 对象指针
 * @return
 */
typedef void(*IMLogBackendDoFlush)(IMLogBackend *sender);

/**
 * MLOG适配层接口
 */
struct IMLogBackendTag
{
    PROTECTED
        IMLogBackendDoOutput DoOutput;  ///< 后端输出事件
        IMLogBackendDoFlush DoFlush;    ///< 后端刷新缓存事件
};

/**
 * 日志输出接口
 * @param sender: 对象指针
 * @param data: 日志数据
 * @param count: 日志项数
 * @return >=0: 输出成功  <:0 失败
 */
Int32 IMLogBackendOutput(IMLogBackend *sender, const TMLogData* data, UInt8 count);

/**
 * 立即刷新缓存接口
 * @param sender: 对象指针
 * @return
 */
void IMLogBackendFlush(IMLogBackend *sender);

#ifdef __cplusplus
} // extern "C" {
#endif
#endif

